package 剑指offer;


import java.util.Random;

/**
 * @author: tyy 剑指 Offer
 * 384. 打乱数组
给你一个整数数组 nums ，设计算法来打乱一个没有重复元素的数组。
实现 Solution class:
Solution(int[] nums) 使用整数数组 nums 初始化对象
int[] reset() 重设数组到它的初始状态并返回
int[] shuffle() 返回数组随机打乱后的结果
示例：
输入
["Solution", "shuffle", "reset", "shuffle"]
[[[1, 2, 3]], [], [], []]
输出
[null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]
解释
Solution solution = new Solution([1, 2, 3]);
solution.shuffle();    // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如，返回 [3, 1, 2]
solution.reset();      // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3]
solution.shuffle();    // 随机返回数组 [1, 2, 3] 打乱后的结果。例如，返回 [1, 3, 2]
 * @create: 2021-11-20 17:40
 * @description:
 **/
public class Solution29 {

    int[] array;
    int[] original;

    private Random rand = new Random();

    private void swap(int i, int j){
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public Solution29(int[] nums) {
        array = nums;
        original = array.clone();
    }

    public int[] reset() {
        array = original;
        original = original.clone();
        return array;
    }
    //Jdk  Collections.shuffle()方法
    public int[] shuffle() {
        for(int i=array.length;i>1;i--){
            swap(i-1, rand.nextInt(i));
        }

        return array;
    }
    public static void main(String[] args) {
//        Solution29 solution26 = new Solution29();
//        int[] nums = {1,2,2,4};
//        int count = solution26.findLHS(nums);
//        System.out.println("count = " + count);

    }
}
